﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AcademiaEntidades;
using System.Data.SqlClient;
using System.Data;

namespace AcademiaDAO
{
    public class CuotaMatriculaDAO
    {
        public static List<CuotaMatricula> ObtenerTodas(int? idAlumno, int? idMatricula)
        {
            List<CuotaMatricula> cuotas = new List<CuotaMatricula>();
            SqlConnection conn = null;
            try
            {
                conn = AccesoDato.Conectar();
                StringBuilder sql = new StringBuilder("SELECT cm.IdCuotaMatricula, cm.NumeroCuota, cm.IdMatricula, cm.Monto, cm.Descripcion, cm.FechaVencimiento FROM CuotaXMatricula cm");
                sql.Append("INNER JOIN Matricula m ON cm.IdMatricula = m.IdMatricula WHERE 1=1 ");

                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;

                if (idAlumno.HasValue)
                {
                    sql.Append(" AND m.IdAlumno = @IdAlumno");
                    cmd.Parameters.AddWithValue("@IdAlumno", idAlumno);
                }

                if (idMatricula.HasValue)
                {
                    sql.Append(" AND IdMatricula = @IdMatricula");
                    cmd.Parameters.AddWithValue("@IdMatricula", idMatricula);
                }

                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    int id = dr.GetInt32(0);
                    int nroCuota = dr.GetInt32(1);
                    int idMat = dr.GetInt32(2);
                    decimal monto = dr.GetDecimal(3);
                    string descripcion = null;
                    if (dr["Descripcion"] != DBNull.Value)
                    {
                        descripcion = dr.GetString(4);
                    }
                    DateTime fechaVenc = dr.GetDateTime(5);

                    CuotaMatricula cm = new CuotaMatricula()
                    {
                        IdCuotaMatricula = id,
                        NumeroCuota = nroCuota,
                        IdMatricula = idMat,
                        Monto = monto,
                        Descripcion = descripcion,
                        FechaVencimiento = fechaVenc
                    };

                    cuotas.Add(cm);
                }
                return cuotas;
            }
            catch (SqlException ex)
            {
                throw new Exception("No se pudo obtener las cuotas");
            }
            finally
            {
                if (conn != null && conn.State == System.Data.ConnectionState.Open)
                {
                    conn.Close();
                }
            }  
        }

        public static List<CuotaMatricula> ObtenerPorAlumno(int idAlumno)
        {
            return ObtenerTodas(idAlumno, null);
        }

        public static DataTable ObtenerTodasTable(int? idAlumno, int? idMatricula, bool excluirCobradas)
        {
            SqlConnection conn = null;
            try
            {
                conn = AccesoDato.Conectar();
                StringBuilder sql = new StringBuilder("SELECT cm.IdCuotaMatricula, c.Nombre, cm.NumeroCuota, cm.Monto FROM CuotaXMatricula cm ");
                sql.Append("INNER JOIN Matricula m ON cm.IdMatricula = m.IdMatricula ");
                sql.Append("INNER JOIN Curso c ON m.IdCurso = c.IdCurso").Append(" WHERE 1=1 ");

                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;

                if (idAlumno.HasValue)
                {
                    sql.Append(" AND m.IdAlumno = @IdAlumno ");
                    cmd.Parameters.AddWithValue("@IdAlumno", idAlumno);
                }

                if (idMatricula.HasValue)
                {
                    sql.Append(" AND m.IdMatricula = @IdMatricula ");
                    cmd.Parameters.AddWithValue("@IdMatricula", idMatricula);
                }

                if (excluirCobradas)
                {
                    sql.Append(" AND cm.IdCuotaMatricula NOT IN (SELECT dc.IdCuotaMatricula FROM DetalleCobro dc) ");
                }

                cmd.CommandType = CommandType.Text;
                cmd.CommandText = sql.ToString();

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);

                return dt;
            }
            catch (SqlException ex)
            {
                throw new Exception("No se pudo obtener las cuotas");
            }
            finally
            {
                if (conn != null && conn.State == System.Data.ConnectionState.Open)
                {
                    conn.Close();
                }
            }  
        }

        public static DataTable ObtenerPorAlumnoTable(int idAlumno)
        {
            return ObtenerTodasTable(idAlumno, null, true);
        }
    }
}
